package day03;

import lombok.extern.slf4j.Slf4j;
import utils.Sleeper;

import java.util.concurrent.locks.ReentrantLock;

/**
 *  可打断锁
 * */
@Slf4j
public class test2 {

    // 可重入锁
    private final static ReentrantLock lock = new ReentrantLock();
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread("t1") {
            @Override
            public void run() {
                try {
                    // 如果没有竞争,就能够直接获取锁
                    // 如果存在竞争,就会进行阻塞死等
                    log.debug("尝试获取锁");
                    lock.lockInterruptibly();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    log.debug("没有获取锁");
                    return;
                }
                try {
                    log.debug("获取到锁");
                } finally {
                    lock.unlock();
                }
            }
        };

        // 主线程获取到锁了，这时候t1就会阻塞 如果再调用interrupt打断方法就能打断t1线程 抓住异常打印出去
        lock.lock();
        t1.start();
        Sleeper.sleep(1);
        log.debug("打断");
        t1.interrupt();

    }
}
